<?php

class AxeCompiler {

    /**
     * Axe对象指针
     * @var object pointer 
     */
    public $axe;

    /**
     * 编译文件路径
     * @var type 
     */
    private $comfile;

    /**
     * 编译文件目录
     * @var type 
     */
    private $comDir;
    
    /**
     * 编译方法遍历应用
     * @var type 
     */
    private $comFun = array(
        'compile_var'
    );

    /**
     * 判断是否已经编译
     * 使用文件完整路径、文件修改时间、和cacheId辨别
     * @param type $tpl 模板文件名
     * @param type $cacheId 缓存id
     * @return boolean [true|false]
     */
    private function is_compiled() {
        // 组装编译文件目录
        $this->comDir = $this->axe->real_path
                . $this->axe->config['compile_dir']
                . DIRECTORY_SEPARATOR;
        // 组装编译文件路径
        $this->comfile = $this->comDir
                . $this->get_compile_hash($this->axe->tplfile, filemtime($this->axe->tplfile), $this->axe->config['cacheId'])
                . '.axe^compiled.php';
        return is_file($this->comfile);
    }

    /**
     * 编译模板文件
     * @param type $tpl
     * @param type $cacheId
     * @todo 重新编译时，清除旧文件
     * @return type
     */
    final public function compile() {
        // 未编译则进行编译，否则返回
        if (!$this->is_compiled()) {
            // 读取模板文件
            $tfile = file_get_contents($this->axe->tplfile);

            foreach ($this->comFun as $fun) {
                $tfile = $this->$fun($tfile);
            }
            
            // todo
            // todo
            $comfile = $tfile;
            // todo
            // 目录检查
            if (!is_dir($this->comDir)) {
                mkdir(dirname($this->comfile), 644);
            }
            // 写入模板文件
            file_put_contents($this->comfile, $comfile);
        }
        return $this->comfile;
    }

    /**
     * 变量嵌入编译
     * @param type $cot
     */
    private function compile_var($cot) {
        // 匹配 {$foo}
        if (strpos($cot, '{$') !== false) {
            $cot = preg_replace("#\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}#", "<?php echo \$this->aStack['\\1'];?>", $cot);
        }
        return $cot;
    }

    /**
     * 生成模板唯一标签 使用md4摘要性能比较好
     * @param type $tpl
     * @param type $cacheId
     * @see http://www.cnblogs.com/AloneSword/p/3464330.html
     * @return type
     */
    private function get_compile_hash($tpl, $filemtime, $cacheId = false) {
        return hash('md4', $tpl . $filemtime . $cacheId);
    }

}
